/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import it.dei.unipd.healthservice.resource.*;

/**
 * Rappresenta i dati di un ordine effettuato da una fabbrica
 * 
 * @author Giorgio Vitale
 * @version 1.00
 */
public class ViewOrdiniFornitoriDatabase {
	/**
	 * Interrogazione al database per la ricerca degli ordini con un certo stato.
	 */
	private static final String RICERCA_PER_STATO = "SELECT * FROM ordinefornitura WHERE stato=?::stato_ordine ORDER BY dataordine desc, dataconsegna desc;";
	/**
	 * Interrogazione al database per la ricerca di tutti gli ordini.
	 */
	private static final String RICERCA_GLOBALE = "SELECT * FROM ordinefornitura ORDER BY dataordine desc, dataconsegna desc;";
	/**
	 * Interrogazione al database per la ricerca di un ordine
	 */
	private static final String RICERCA_PER_ID = "SELECT * FROM ordinefornitura WHERE idordinefornitura=? ORDER BY dataordine desc, dataconsegna desc;";
	
	/**
	 * Connessione al database
	 */
	private final Connection con;
	/**
	 * Stato da ricercare
	 */
	private final StatoOrdine stato;
	/**
	 * ID da ricercare
	 */
	private final Integer idOrdine;
	/**
	 * Risultati della ricerca
	 */
	private final List<OrdineFornitura> ordini;

	/**
	 * Ricerca tutti gli ordini
	 * @param con connessione al database
	 */
	public ViewOrdiniFornitoriDatabase(Connection con){
		this(con, null, null);
	}
	/**
	 * Ricerca tutti gli ordini con un certo stato
	 * 
	 * @param con connessione al database.
	 * @param stato stato dell'ordine
	 */
	public ViewOrdiniFornitoriDatabase(Connection con, StatoOrdine stato) {
		this(con, stato, null);
	}
	/**
	 * Ricerca gli ordini con un certo id
	 * @param con connessione al database
	 * @param id id da ricercare
	 */
	public ViewOrdiniFornitoriDatabase(Connection con, Integer id){
		this(con, null, id);
	}

	/**
	 * Ricerca gli ordini
	 * @param con connessione al database
	 * @param idOrdine id da ricercare
	 * @param stato stato da ricercare
	 */
	protected ViewOrdiniFornitoriDatabase(Connection con, StatoOrdine stato, Integer idOrdine){
		this.con = con;
		ordini = new ArrayList<OrdineFornitura>();
		this.idOrdine = idOrdine;
		this.stato = stato;
	}
	/**
	 * Cerca gli ordini
	 * 
	 * @return una lista di ordini.
	 * @throws SQLException
	 *             in caso di problemi nell'accesso al database.
	 */
	public List<OrdineFornitura> search() throws SQLException {

		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			if (stato==null && idOrdine==null)
				pstmt = con.prepareStatement(RICERCA_GLOBALE);
			if (stato!=null){
				pstmt = con.prepareStatement(RICERCA_PER_STATO);
				pstmt.setString(1, stato.name());
			}
			if (idOrdine!=null){
				pstmt = con.prepareStatement(RICERCA_PER_ID);
				pstmt.setInt(1, idOrdine);
			}
			rs = pstmt.executeQuery();
			while (rs.next())
				try{
					ordini.add(new OrdineFornitura(rs.getInt("idordinefornitura"), 
								StatoOrdine.valueOf(rs.getString("stato")), rs.getDate("dataordine"), 
								rs.getDate("dataconsegna"), rs.getString("piva")));
				}catch (IllegalArgumentException e){}
		}
		finally {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			con.close();
		}
		return ordini;
	}
}